package com.uniedp.common.handle;

import com.uniedp.core.utils.MessageUtils;
import com.uniedp.modules.security.dto.LoginDTO;
import com.uniedp.modules.security.dto.ValidateCodeLoginDTO;
import com.uniedp.modules.security.service.handler.UserLoginHandler;
import com.uniedp.modules.sys.dto.SysUserDTO;
import lombok.extern.log4j.Log4j2;
import org.springframework.stereotype.Component;

/**
 * 登录事件实现类
 */
@Component
@Log4j2
public class EdpUserLoginHandler implements UserLoginHandler {
    /**
     * 验证码验证失败事件，（在邮箱手机号注册时触发）
     * @param validateCodeLogin 手机登录参数
     */
    @Override
    public void onCodeValidFail(ValidateCodeLoginDTO validateCodeLogin) {
        log.debug("验证码验证失败：{}", validateCodeLogin);
    }

    /**
     * 验证码验证成功事件，（在邮箱手机号注册时触发）
     * @param validateCodeLogin dto 手机登录参数
     */
    @Override
    public void onCodeValidSuccess(ValidateCodeLoginDTO validateCodeLogin) {
        log.debug("验证码验证成功：{}", validateCodeLogin);
    }

    /**
     * 在用户登录成功之前调用
     * @param dto               账号登录参数，账号登录时不为空
     * @param validateCodeLogin 验证码登录参数
     * @param user              用户信息
     */
    @Override
    public void onBeforeLogin(LoginDTO dto, ValidateCodeLoginDTO validateCodeLogin, SysUserDTO user) {
        // 可在此实现扩展用户登录逻辑，如果不允许此用户登录可抛出异常阻止用户登录
        // 例如：throw new NewSailException("参数不能为空");
        // 通过 dto.getData() 或 validateCodeLogin.getData() 可获取到用户登录时传递的扩展数据
        log.debug("用户登录成功之前：{} {} {}", dto, validateCodeLogin, user);
    }

    /**
     * 在用户登录成功之后调用
     * @param dto               账号登录参数，账号登录时不为空
     * @param validateCodeLogin 验证码登录参数，验证码登录时不为空
     * @param user              用户信息
     * @param token             签发token
     */
    @Override
    public void onAfterLogin(LoginDTO dto, ValidateCodeLoginDTO validateCodeLogin, SysUserDTO user, String token) {
        // 可在此实现业务逻辑
        log.debug("用户登录成功之后：{} {} {} {}", dto, validateCodeLogin, user, token);
    }

    /**
     * 用户登录失败事件
     * @param dto               账号登录参数，账号登录时不为空
     * @param validateCodeLogin 验证码登录参数，验证码登录时不为空
     * @param user              用户信息（可能为空）
     * @param errorCode         错误代码 10010:账号不存在 1005:账号已被停用 10032:账号锁定 10004:账号或密码错误 0:短信/邮箱验证码错误
     */
    @Override
    public void onLoginFail(LoginDTO dto, ValidateCodeLoginDTO validateCodeLogin, SysUserDTO user, int errorCode) {
        log.debug("用户登录失败({})：{} {} {}", errorCode == 0 ? errorCode : MessageUtils.getMessage(errorCode), dto, validateCodeLogin, user);
    }
}
